from sqlalchemy import delete, select, update
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.do.llm_do import LlmConfig
from module_admin.entity.vo.llm_vo import LlmModel, LlmPageQueryModel
from utils.page_util import PageUtil


class LlmDao:
    """
    大模型配置模块数据库操作层
    """

    @classmethod
    async def get_llm_detail_by_id(cls, db: AsyncSession, id: int):
        """
        根据ID获取大模型配置详细信息

        :param db: orm对象
        :param id: ID
        :return: 大模型配置信息对象
        """
        llm_info = (
            (await db.execute(select(LlmConfig).where(LlmConfig.id == id)))
            .scalars()
            .first()
        )

        return llm_info

    @classmethod
    async def get_llm_detail_by_info(cls, db: AsyncSession, llm: LlmModel):
        """
        根据大模型配置参数获取大模型配置信息

        :param db: orm对象
        :param llm: 大模型配置参数对象
        :return: 大模型配置信息对象
        """
        llm_info = (await db.execute(select(LlmConfig).where())).scalars().first()

        return llm_info

    @classmethod
    async def get_llm_list(
        cls, db: AsyncSession, query_object: LlmPageQueryModel, is_page: bool = False
    ):
        """
        根据查询参数获取大模型配置列表信息

        :param db: orm对象
        :param query_object: 查询参数对象
        :param is_page: 是否开启分页
        :return: 大模型配置列表信息对象
        """
        query = (
            select(LlmConfig)
            .where(
                (
                    LlmConfig.model_name.like(f"%{query_object.model_name}%")
                    if query_object.model_name
                    else True
                ),
            )
            .order_by(LlmConfig.id)
            .distinct()
        )
        llm_list = await PageUtil.paginate(
            db, query, query_object.page_num, query_object.page_size, is_page
        )

        return llm_list

    @classmethod
    async def get_used_llm_list(cls, db: AsyncSession):
        """
        根据查询参数获取大模型配置列表信息

        :param db: orm对象
        :param query_object: 查询参数对象
        :param is_page: 是否开启分页
        :return: 大模型配置列表信息对象
        """
        query = (
            select(LlmConfig)
            .where((LlmConfig.used == 0))
            .order_by(LlmConfig.id)
            .distinct()
        )
        llm_list = await PageUtil.paginate(db, query, 1, 1000, False)

        return llm_list

    @classmethod
    async def add_llm_dao(cls, db: AsyncSession, llm: LlmModel):
        """
        新增大模型配置数据库操作

        :param db: orm对象
        :param llm: 大模型配置对象
        :return:
        """
        db_llm = LlmConfig(
            **llm.model_dump(
                exclude={
                    "id",
                }
            )
        )
        db.add(db_llm)
        await db.flush()

        return db_llm

    @classmethod
    async def edit_llm_dao(cls, db: AsyncSession, llm: dict):
        """
        编辑大模型配置数据库操作

        :param db: orm对象
        :param llm: 需要更新的大模型配置字典
        :return:
        """
        await db.execute(update(LlmConfig), [llm])

    @classmethod
    async def delete_llm_dao(cls, db: AsyncSession, llm: LlmModel):
        """
        删除大模型配置数据库操作

        :param db: orm对象
        :param llm: 大模型配置对象
        :return:
        """
        await db.execute(delete(LlmConfig).where(LlmConfig.id.in_([llm.id])))
